001 /*
002 * Copyright (c) 2005 Stephen J. McConnell
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
013 * implied.
014 *
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package net.dpml.metro.tools;
020
021 import org.apache.tools.ant.BuildException;
022
023 import net.dpml.state.Trigger.TriggerEvent;
024 import net.dpml.state.DefaultTrigger;
025 import net.dpml.state.DefaultTransition;
026 import net.dpml.state.DefaultOperation;
027 import net.dpml.state.ApplyAction;
028 import net.dpml.state.ExecAction;
029
030 /**
031 * Utility datatype supporting a Transition instance construction.
032 *
033 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
034 * @version 1.1.0
035 */
036 public class TriggerDataType
037 {
038 private String m_event;
039 private OperationDataType m_operation;
040 private TransitionDataType m_transition;
041 private ApplyDataType m_apply;
042 private ExecDataType m_exec;
043
044 /**
045 * Set the trigger event class.
046 * @param event the event name
047 */
048 public void setEvent( final String event )
049 {
050 if( null == event )
051 {
052 throw new NullPointerException( "event" );
053 }
054 m_event = event;
055 }
056
057 /**
058 * Add an operation to the trigger.
059 * @return the operation datatype
060 */
061 public OperationDataType createOperation()
062 {
063 if( ( null != m_operation ) || ( null != m_transition ) || ( null != m_apply ) || ( null != m_exec ) )
064 {
065 final String error =
066 "Trigger action is already defined.";
067 throw new IllegalStateException( error );
068 }
069 m_operation = new OperationDataType();
070 return m_operation;
071 }
072
073 /**
074 * Add an transition to the trigger.
075 * @return the transition datatype
076 */
077 public TransitionDataType createTransition()
078 {
079 if( ( null != m_operation ) || ( null != m_transition ) || ( null != m_apply ) || ( null != m_exec ) )
080 {
081 final String error =
082 "Trigger action is already defined.";
083 throw new IllegalStateException( error );
084 }
085 m_transition = new TransitionDataType();
086 return m_transition;
087 }
088
089 /**
090 * Add an apply to the trigger.
091 * @return the apply datatype
092 */
093 public ApplyDataType createApply()
094 {
095 if( ( null != m_operation ) || ( null != m_transition ) || ( null != m_apply ) || ( null != m_exec ) )
096 {
097 final String error =
098 "Trigger action is already defined.";
099 throw new IllegalStateException( error );
100 }
101 m_apply = new ApplyDataType();
102 return m_apply;
103 }
104
105 /**
106 * Add an exec to the trigger.
107 * @return the exec datatype
108 */
109 public ExecDataType createExec()
110 {
111 if( ( null != m_operation ) || ( null != m_transition ) || ( null != m_apply ) || ( null != m_exec ) )
112 {
113 final String error =
114 "Trigger action is already defined.";
115 throw new IllegalStateException( error );
116 }
117 m_exec = new ExecDataType();
118 return m_exec;
119 }
120
121 DefaultTrigger getTrigger()
122 {
123 TriggerEvent event = getTriggerEvent();
124 if( m_apply != null )
125 {
126 ApplyAction action = m_apply.getAction();
127 return new DefaultTrigger( event, action );
128 }
129 else if( m_exec != null )
130 {
131 ExecAction action = m_exec.getAction();
132 return new DefaultTrigger( event, action );
133 }
134 else if( m_operation != null )
135 {
136 DefaultOperation action = m_operation.getOperation();
137 return new DefaultTrigger( event, action );
138 }
139 else if( m_transition != null )
140 {
141 DefaultTransition action = m_transition.getTransition();
142 return new DefaultTrigger( event, action );
143 }
144 else
145 {
146 final String error =
147 "Missing action ('operation'|transition'|'apply'|'exec') element in trigger.";
148 throw new BuildException( error );
149 }
150 }
151
152 TriggerEvent getTriggerEvent()
153 {
154 if( null == m_event )
155 {
156 throw new BuildException( "Missing event attribute in trigger." );
157 }
158 else
159 {
160 return TriggerEvent.parse( m_event );
161 }
162 }
163 }